<?php
	//***************************【自定义数组函数】***********************************
	//调试使用格式化输出数组
	function p($array,$die=true){
		dump($array,1,'<pre>',0);
		if($die) die;
	}

	//递归数据中指定键名的值
	function unlimited_key($array,$key,$p_key){
		//数组，要取值的键名，父项的键名
		$data=array();
		foreach($array as $val){
			$name=$val[$key];
			$data[]=$name;
			$data=array_merge(unlimited_key($val[$p_key],$key,$p_key),$data);
		}
		return $data;
	}
	
	//返回数组中指定的一列函数  （仿array_column函数）
	function column_array($array,$field,$key=''){
		$new_array=array();
		foreach($array as $a){
			if($key==''){										//如果没有设置KEY的值则默认生成
				$new_array[]=$a[$field];
			}else{
				$new_array[$a[$key]]=$a[$field];
			}
		}
		return $new_array;
	}
	
	//动态修改一维数组的键名
	function set_key($array,$rule='',$mark='',$unset='',$cover=true){
		//数组，键名规则[ , 隔开]，键名连接符号，重建时要删除的数据[ , 隔开]，是否覆盖同键名数组
		$rule=explode(',',$rule);
		$new_arr=array();
		$unset=explode(',',$unset);
		foreach($array as $a){
			if(count($unset)>0){								//删除要清除的数组数据
				foreach($unset as $u){
					unset($a[$u]);
				}
			}
			
			$key_name=array();
			foreach($rule as $r){
				$key_name[$r]=$a[$r];
			}
			$key_name=implode($mark,$key_name);
			if($cover){
				$new_arr[$key_name]=$a;						//按键名规则重组数组[覆盖同名]
			}else{
				$new_arr[$key_name][]=$a;					//按键名规则重组数组[不覆盖同名]
			}
		}
		return $new_arr;
	}

	//分类数组构建函数
	function get_type_array($array,$keyname='',$addition='',$unset='',$index=false){
		//数组，分类id根据,额外附属的,序列ID（空为自动序列）
		
		$new_arr=array();
		$addition=explode(',',$addition);
		$unset=explode(',',$unset);
		$i=0;

		foreach($array as $ar){
			if(count($unset)>0){								//删除要清除的数组数据
				foreach($unset as $u){
					unset($ar[$u]);
				}
			}
			
			foreach ($addition as $aval) {					//数组提取额外数据
				$new_arr[$ar[$keyname]][$aval]=$ar[$aval];
			}
			$new_arr[$ar[$keyname]]['list'][]=$ar;				//按键名规则重组数组[不覆盖同名]
		}

		if($index){
			$new_arr2=array();
			foreach ($new_arr as $val) {
				$new_arr2[]=$val;
			}
			return $new_arr2;
		}else{
			return $new_arr;
		}
	}
	
	//合并数组的键名为字符串
	function implode_key($mark,$array){
		$str='';
		foreach($array as $k=>$a){
			if($k!='') $str.=$k.$mark;
		}
		$str=substr($str,0,-strlen($mark));
		return $str;
	}
	
	//获取一个数组的最大和最小值
	function get_min_max($array){
		$length=count($array);
		if($length>0){						
			sort($array,SORT_NUMERIC);
			$new_array=array();
			$new_array['min']=$array[0];
			$new_array['max']=$array[$length-1];
			return $new_array;
		}else{
			return false;
		}
	}
	
	//数组生成查询条件函数
	function array_where_str($array,$field,$link,$left='',$right=''){
		//数组，查询字段，连接符（or,and）,内容左边符号，内容右边符号
		$str='';
		foreach($array as $val){
			$str.=$field.'='.$left.$val.$right.' '.$link.' ';
		}
		$str=substr($str,0,strlen($str)-(strlen($link)+2));
		return $str;
	}
	
	//二位数组指定键名生成查询条件函数
	function key_where_str($array,$field,$link,$key_name,$left='',$right=''){
		//数组，查询字段，连接符（or,and）,指定键名,内容左边符号，内容右边符号
		$str='';
		foreach($array as $arr){
			$str.=$field.'='.$left.$arr[$key_name].$right.' '.$link.' ';
		}
		$str=substr($str,0,strlen($str)-(strlen($link)+2));
		return $str;
	}
	
	//XML转数组
	function xml_to_array($xml){
		$xml=new SimpleXMLElement($xml);
		return deep_xml_array($xml);
	}
	
	//XML数组深度循环解析（子函数）
	function deep_xml_array($data){
		$array=array();
		foreach ($data as $k => $v) {
			if(count($v)>1){
				$array[$k]=deep_xml_array($v);
			}else{
				$array[$k]=strval($v);
			}
		}
		return $array;
	}
	
	// 通过.的格式获取某个数组下的参数，比如  a.b.c
	function spot_key($array,$key){
		if(!is_array($key)) $key=explode('.',$key);
		foreach($key as $v){
			if(isset($array[$v])){
				$array=$array[$v];
			}else{
				return '';
			}
		}
		return $array;
	}
?>